# coding: utf8
"""
数据结构：字符串、元组、列表、集合、字典、相关方法
"""

"""
多变量声明与字符串
"""
# 声明数字
number: int = 1

# 声明字符串
string: str = "SINOPEC"  # 三个引号可以换行'''SNP'''
number, string = 1, "SINOPEC"

# 去空格、分隔、替换等
string.strip()
string.split()
string.replace("INOPEC", "inopec")
string.lower()
string.startswith("S")

# 格式化
print(f"{string} => {number}")  # 打印 SINOPEC => 1

"""
tuple永恒元组
"""
numbers: tuple = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# 元组是不可变的，numbers[1] = 2会报错

# 输出2组0-9的新元组(0,...,9, 0,...,9)
print(numbers * 2)

# 输出新元组(0,...,9, 10, 11, 12)
numbers.__add__((10, 11, 12))

# 切片，得到新的tuple(0, 1)，接下来详细介绍切片。
print(numbers[0:2])

"""
list可变列表
"""

# 等同words = ['S', 'I', 'N', 'O', 'P', 'E', 'C']
words: list = list("SINOPEC")

words.remove('S'), words.pop(0)  # 按“值、索引”删除其中1个元素
words.insert(0, 'S'), words.append('C')  # 首尾添加元素

# 正反排序，['C', 'E', 'I', 'N', 'O', 'P', 'S']
sorted(words, reverse=False)
# 颠倒顺序，['C', 'E', 'P', 'O', 'N', 'I', 'S']
print(list(reversed(words)))

# 取值'S', 'C', 'C'
print(words[0], words[len(words) - 1], words[-1])

# 切片，从开始到结尾前（不含结尾，遵守衔接规则）
print(words[0:2], words[2:4], words[4:6], words[6:7])

# (['S', 'I'],      ['N', 'O'], 	  ['P', 'E'],          ['C'])
print(words[0:7:2])  # 2个索引取一次值，['S', 'N', 'P', 'C']
words.extend(words)  # 扩充列表，等同于 words * 2
print(words)

"""
set无序集合
"""
words: set = set("SINOPEC")  # 等同words = {'S', 'I', 'N', 'O', 'P', 'E', 'C'}
# 集合内元素是无序，且不能重复的，不支持切片！
list(set("SINOPEC"))  # 不同机器执行结果不同['S', 'N', 'C', 'E', 'O', 'P', 'I']
words.add('S'), words.remove('S')  # 添加和删除元素
words.intersection({'S', 'I', 'N'}, {'S', 'I'})  # 交集，{'S', 'I'}
# 并集，{'A', 'C', 'I', 'N', 'O', 'P', 'S'}
words.union({'S', 'I', 'N'}, {'S', 'I'})
words.difference({'S', 'I', 'N'}, {'S', 'I'})  # 差集，{'A', 'C', 'O', 'P'}

set1, set2 = {1, 2, 3}, {2, 3, 4}
print(set1 & set2, set1 | set2)  # 交集和并集操作符
print(set1 - set2, set2 - set1)  # 差集操作符，前者中不同于后者的

# 对list或tuple中元素去重
set(list("APPLE")), set(list("APPLE"))  # {'A', 'E', 'L', 'P'}

"""
dict哈希字典
"""
words: dict = dict(S=0, N=1, P=2)  # 等同words = {"S": 0, "N": 1, "P": 2}
# 字典是无序的，不支持切片，且key不能是可变数据（比如：list）
words['C'] = 3, words.pop('C', 3)  # 添加和删除元素
print(words['C']), words.get('C', 3)  # 取值，建议使用get方法
words.update({"S": 1, "C": 3})  # 更新字典{'S': 1, 'N': 1, 'P': 2, 'C': 3}
words.keys(), words.values()  # 获取所有key和所有value
list(words.items())  # 成对获取key和value，[('S', 0), ('N', 1), ('P', 2)]

"""
数据结构-方法
"""

# 创建
list(range(10))  # 10个元素列表 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
dict.fromkeys(range(10), 0)
# 全0字典 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}

# 转换
dict(zip(range(10), [0] * 10))  # 压缩配对，同dict.fromkeys方法
list(map(str, range(10)))  # 映射列表元素到方法中逐个处理
# 输出['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

# 统计
min(range(10)), max(range(10)), sum(range(10))  # 0, 9, 45
range(10).count(0)  # 元素0出现的个数，1
